| body% - тело coll% - номер контакта |
| Возвращает общее значение проекции силы нормального давления в контакте с номером Coll. |
|
;пример использования функций ;pxContactGetForceN Graphics3D 800,600,32,2 AmbientLight 64,64,64 Global cam = CreateCamera() CameraClsColor cam,25,30,70 PositionEntity cam,-5,13,-30 light= CreateLight() RotateEntity light,20,50,0 ;создаем физический мир pxCreateWorld(0) pxSetGravity(0, -100, 0) ;Создаем статичный уровень level_mesh = LoadMesh("media\level.b3d") ScaleMesh level_mesh,1,2,1 celltex = LoadTexture("media\Cell.bmp") EntityTexture level_mesh,celltex ScaleTexture celltex,.01,.01 ;создаем физическую поверхность level_body = CreateTrimeshMesh(level_mesh) ;создаем кубик cube_body = pxCreateCube(5,5,5, 1) pxSetPosition cube_body,10,6,0 pxSetRotation cube_body,0,0,90 cube_mesh=CreateCube () ScaleMesh cube_mesh,5,5,5 ;cоздаем сферу sphere_body = PxCreateSphere(10,1) pxSetPosition sphere_body,14,25,0 sphere_mesh=CreateSphere() ScaleMesh sphere_mesh,10,10,10 ;грузим звук для столкновений и скольжения Global snd = LoadSound("media\bounce.wav") While Not(KeyHit(1)) ;обсчитываем физический мир RenderPhysic(60,0) ;ставим визуальные тела позицию физических pxSetEntity cube_mesh,cube_body pxSetEntity sphere_mesh,sphere_body RenderWorld RenderContacts(sphere_body,255,0,0) RenderContacts(cube_body,0,255,0) Flip Wend Function RenderContacts(body,r%,g%,b%) ncoll = pxGetContacts(body) For i = 0 To ncoll-1 ;сила нормального давления fx# = pxContactGetForceTX(body,i) fy# = pxContactGetForceTY(body,i) fz# = pxContactGetForceTZ(body,i) f# = Sqr(fx*fx+fy*fy+fz*fz) ;звук удара при скорости удара (по нормали) более 3 ; --------------- Применяем pxContactGetForceN vel# = pxContactGetForceN(body,i) If Abs(vel)>3 chn = PlaySound(snd) ChannelVolume chn,Abs(vel)/15.0 EndIf ;звук трения при скорости по касательной более 3 ;(пусть будет тот же звук, но приглушенный) tvel# = pxContactGetForceT(body,i) If Abs(tvel)>.9 chn = PlaySound(snd) ChannelVolume chn,Abs(tvel)/150.0 ChannelPitch chn,4000 EndIf Color r,g,b;255-f*50,f*50,f*50 ;получаем координаты точки контакта... x# = pxContactGetPointX(body,i) y# = pxContactGetPointY(body,i) z# = pxContactGetPointZ(body,i) CameraProject cam,x,y,z sx# =ProjectedX():sy# =ProjectedY() Oval sx-2,sy-2,4,4 ; ...и нормали. x# = x# + pxContactGetPointNX(body,i) y# = y# + pxContactGetPointNY(body,i) z# = z# + pxContactGetPointNZ(body,i) CameraProject cam,x,y,z sx2# =ProjectedX():sy2# =ProjectedY() CameraProject cam,x,y,z sx2# =ProjectedX():sy2# =ProjectedY() Color r,g,b Line sx,sy,sx2,sy2 Color 255,255,255 Next End Function Function CreateTrimeshMesh(mesh%) nsurf = CountSurfaces(mesh) nvert = 0 nface=0 For ns = 1 To nsurf Local surf = GetSurface(mesh,ns) nface = nface+CountTriangles(surf) nvert = nvert +CountVertices(surf) Next fbank = CreateBank(nface*4*3) nf = 0 vbank = CreateBank(nvert*4*3) nv = 0 For ns = 1 To nsurf surf = GetSurface(mesh,ns) nfv = CountTriangles(surf) For nfc = 0 To nfv -1 PokeInt fbank,nf*12+0,TriangleVertex(surf,nfc,0) PokeInt fbank,nf*12+4,TriangleVertex(surf,nfc,1) PokeInt fbank,nf*12+8,TriangleVertex(surf,nfc,2) nf=nf+1 Next nvv = CountVertices(surf) For nvc = 0 To nvv - 1 PokeFloat vbank,nv*12+0,VertexX(surf,nvc) PokeFloat vbank,nv*12+4,VertexY(surf,nvc) PokeFloat vbank,nv*12+8,VertexZ(surf,nvc) nv = nv+1 Next Next bbb%=pxCreateStaticTriMesh(vbank, fbank, nvert, nface) FreeBank vbank FreeBank fbank Return bbb% End Function |
К содержанию
Нажмите здесь чтобы увидеть последнюю версию этой странички в режиме online.